/**
 * Copyright (c) 2006, Sun Microsystems, Inc
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and ttihe following
 *     disclaimer in the documentation and/or other materials provided
 *     with the distribution.
 *   * Neither the name of the TimingFramework project nor the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

package org.jdesktop.animation.timing.examples;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

import org.jdesktop.animation.timing.Animator;
import org.jdesktop.animation.timing.Animator.EndBehavior;
import org.jdesktop.animation.timing.interpolation.PropertySetter;
import org.jdesktop.animation.timing.triggers.ActionTrigger;
import org.jdesktop.animation.timing.triggers.FocusTrigger;
import org.jdesktop.animation.timing.triggers.FocusTriggerEvent;
import org.jdesktop.animation.timing.triggers.MouseTrigger;
import org.jdesktop.animation.timing.triggers.MouseTriggerEvent;
import org.jdesktop.animation.timing.triggers.TimingTrigger;
import org.jdesktop.animation.timing.triggers.TimingTriggerEvent;

/**
 * Demonstrates simple animation effects triggered by events. Events trigger
 * animated painting of some objects in the window (not the buttons themselves,
 * just to simplify the example code).
 * 
 * @author Chet
 */
public class Triggers extends JComponent {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int animatingValue = 0;

	/** Creates a new instance of Triggers */
	public Triggers() {
	}

	protected void paintComponent(Graphics g) {
		g.drawString(Integer.toString(animatingValue), 20, 100);
	}

	public void setAnimatingValue(int animatingValue) {
		this.animatingValue = animatingValue;
		repaint();
	}

	private static void createAndShowGUI() {
		UIManager.put("swing.boldMetal", Boolean.FALSE);
		JFrame f = new JFrame("Timing Demo");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.setLayout(new BorderLayout());

		// Create panel with buttons
		f.setSize(300, 300);
		Triggers panel = new Triggers();
		panel.setLayout(null);
		panel.setupButtons(panel);

		f.add(panel, BorderLayout.CENTER);
		f.setVisible(true);
	}

	private void setupButtons(JComponent panel) {
		Color inactiveColor = Color.lightGray;
		Color activeColor = Color.yellow;
		// Create and add them to the panel
		JButton button = new JButton("Trigger Button");
		panel.add(button);
		button.setBounds(0, 0, 150, 30);
		JButton otherButton = new JButton("Other Button");
		panel.add(otherButton);
		otherButton.setBounds(0, 40, 150, 30);

		// Create the labels where the effects will animate
		JLabel enter = new JLabel("Enter");
		enter.setBounds(200, 0, 100, 50);
		enter.setOpaque(true);
		enter.setBackground(inactiveColor);
		JLabel focus = new JLabel("Focus");
		focus.setBounds(200, 50, 100, 50);
		focus.setOpaque(true);
		focus.setBackground(inactiveColor);
		JLabel action = new JLabel("Action");
		action.setBounds(200, 100, 100, 50);
		action.setOpaque(true);
		action.setBackground(inactiveColor);
		JLabel press = new JLabel("Press");
		press.setBounds(200, 150, 100, 50);
		press.setOpaque(true);
		press.setBackground(inactiveColor);
		panel.add(enter);
		panel.add(focus);
		panel.add(action);
		panel.add(press);

		// Create a hover effect for button1
		Animator animator = PropertySetter.createAnimator(1000, enter,
				"background", inactiveColor, activeColor);
		MouseTrigger
				.addTrigger(button, animator, MouseTriggerEvent.ENTER, true);

		// Create a click effect
		animator = PropertySetter.createAnimator(1000, action, "background",
				activeColor);
		animator.setEndBehavior(EndBehavior.RESET);
		ActionTrigger.addTrigger(button, animator);

		// Create a focus effect
		animator = PropertySetter.createAnimator(1000, focus, "background",
				inactiveColor, activeColor);
		FocusTrigger.addTrigger(button, animator, FocusTriggerEvent.IN, true);

		// Create a pressed effect
		animator = PropertySetter.createAnimator(1000, press, "background",
				inactiveColor, activeColor);
		MouseTrigger
				.addTrigger(button, animator, MouseTriggerEvent.PRESS, true);

		// Create a TimingTrigger sequence to animate animatingValue
		Animator animatePositive = PropertySetter.createAnimator(1000, this,
				"animatingValue", 0, 100);
		Animator animateNegative = PropertySetter.createAnimator(1000, this,
				"animatingValue", 0, -100);
		TimingTrigger.addTrigger(animatePositive, animateNegative,
				TimingTriggerEvent.STOP);
		ActionTrigger.addTrigger(button, animatePositive);
	}

	public static void main(String[] args) {
		// Need to do GUI stuff like making the JFrame visible on the
		// Event Dispatch Thread; do this via invokeLater()

		Runnable doCreateAndShowGUI = new Runnable() {
			public void run() {
				createAndShowGUI();
			}
		};
		SwingUtilities.invokeLater(doCreateAndShowGUI);
	}

}
